#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <string>
#include <functional>
using std::cout;
using std::endl;

using func = std::function<void *(void *)>;
static int n = 1;


struct handdata
{
    handdata()
    {
        _a=n;
        _str="钟哥超级nb";
    }
    
    static void* func(void*tpr)
    {
        handdata*temp=(handdata*)tpr;
        temp->change();
    }

    void change()
    {
        cout<<"正在处理数据"<<endl;
        sleep(1);
        _a+=666;
        cout<<"已将处理好50%"<<endl;
        _str+="bb";
        sleep(1);
        cout<<"已经处理好数据了"<<endl;
    }

    void printInfo()
    {
        cout<<_a<<" "<<_str<<endl;
    }
    int _a;
    std::string _str;
};


template<class T>
class Mythread
{
public:
    // static void *run(void *data)
    // {
    //     std::string temp((char *)data);
    //     while (1)
    //     {
    //         cout << temp << endl;
    //         sleep(1);
    //     }
    //     return nullptr;
    // }
    static void *run(void *data)
    {
        std::string temp((char *)data);
        while (1)
        {
            cout << temp << endl;
            sleep(1);
        }
        return nullptr;
    }

    enum status
    {
        WAIT,
        RUNNING,
        EXIT
    };

    Mythread() : _name("pthread" + std::to_string(++n)),_n(n), _statu(WAIT)
    {
        _func = run;
    }

    bool start(T*data)
    {
        _data=data;
        int get=pthread_create(&_tid,nullptr,&T::func,_data);
        //run((void*)_data.c_str());
        if(get==-1)return false;
        _statu=RUNNING;
        return true;
    }

    bool isRunning()
    {
        return _statu==RUNNING;
    }

    bool exit()
    {
        int get=pthread_cancel(_tid);
        if(get==-1) return false;
        _statu=EXIT;
        return true;
    }
    pthread_t tid()
    {
        return _tid;
    }

private:
    std::string _name;
    pthread_t _tid;
    func _func;
    status _statu;
    int _n;
    T* _data;
};




// class Mythread
// {
// public:
//     static void *run(void *data)
//     {
//         std::string temp((char *)data);
//         while (1)
//         {
//             cout << temp << endl;
//             sleep(1);
//         }
        
//         return nullptr;
//     }

//     enum status
//     {
//         WAIT,
//         RUNNING,
//         EXIT
//     };

//     Mythread() : _name("pthread" + std::to_string(++n)),_n(n), _statu(WAIT)
//     {
//         _func = run;
//     }

//     bool start(const std::string&data)
//     {
//         _data=data;
//         int get=pthread_create(&_tid,nullptr,run,(void*)_data.c_str());
//         //run((void*)_data.c_str());
//         if(get==-1)return false;
//         _statu=RUNNING;
//         return true;
//     }

//     bool isRunning()
//     {
//         return _statu==RUNNING;
//     }

//     bool exit()
//     {
//         int get=pthread_cancel(_tid);
//         if(get==-1) return false;
//         _statu=EXIT;
//         return true;
//     }
//     pthread_t tid()
//     {
//         return _tid;
//     }
// private:
//     std::string _name;
//     pthread_t _tid;
//     std::string _data;
//     func _func;
//     status _statu;
//     int _n;
// };
